def bitonic_sort(arr, size, low, high, ascending):
    # 如果子序列长度大于1
    if low < high:
        # 找到子序列的中点
        mid = (low + high) // 2

        # 先递归地对左半部分进行排序
        bitonic_sort(arr, size, low, mid, True)
        # 然后对右半部分进行排序，方向与左半部分相反
        bitonic_sort(arr, size, mid + 1, high, False)

        # 合并两个有序的双调子序列
        for k in range(size):
            # 控制每次比较的步长
            step = 2 ** k

            # 循环终止条件
            while step <= high - low + 1:
                # 从低索引向高索引进行比较和交换
                for i in range(low, high - step + 1, step * 2):
                    # 根据ascending判断应该升序还是降序
                    if ((i + step < high) and 
                        ((arr[i + step] < arr[i]) == ascending)):
                        arr[i], arr[i + step] = arr[i + step], arr[i]

# 使用示例
arr = [5, 3, 7, 6, 2, 8, 1, 4]
size = len(arr)
bitonic_sort(arr, size, 0, size - 1, True)
print("Sorted array:", arr)